package cn.tedu.csmall.business.service.impl;

import cn.tedu.csmall.business.service.IBusinessService;
import cn.tedu.csmall.commons.exception.CoolSharkServiceException;
import cn.tedu.csmall.commons.pojo.order.dto.OrderAddDTO;
import cn.tedu.csmall.commons.restful.ResponseCode;
import cn.tedu.csmall.order.service.IOrderService;
import io.seata.spring.annotation.GlobalTransactional;
import lombok.extern.slf4j.Slf4j;
import org.apache.dubbo.config.annotation.DubboReference;
import org.apache.dubbo.config.annotation.DubboService;
import org.springframework.stereotype.Service;

@Service
@Slf4j
@DubboService
public class BusinessServiceImpl implements IBusinessService {

    @DubboReference
    private IOrderService dubboOrderService;

    // 下面的注解是激活seata分布式事务管理 并开始运行的标记注解
    @GlobalTransactional
    @Override
    public void buy() {
        // 模拟一个下单过程
        OrderAddDTO orderAddDTO=new OrderAddDTO();
        orderAddDTO.setCommodityCode("PC100");
        orderAddDTO.setUserId("UU100");
        orderAddDTO.setCount(5);
        orderAddDTO.setMoney(500);
        log.info("要新增的订单信息为:{}",orderAddDTO);
        //远程调用新增订单方法
        dubboOrderService.insertOrder(orderAddDTO);
        // 下面来编写代码随机抛出异常
        // 注意这个位置发生异常的话,实际上前面已经运行完毕了orderAdd方法
        // 我们需要观察随机发生异常时.各个表中的数据是否能够回滚到方法运行之前
        if(Math.random()<0.5){
            throw new CoolSharkServiceException(ResponseCode.INTERNAL_SERVER_ERROR,"发送随机异常");
        }
    }
}







